local ls = require("luasnip")
local s = ls.snippet
local sn = ls.snippet_node
local t = ls.text_node
local i = ls.insert_node
local f = ls.function_node
local d = ls.dynamic_node
local fmt = require("luasnip.extras.fmt").fmt
local fmta = require("luasnip.extras.fmt").fmta
local rep = require("luasnip.extras").rep
local line_begin = require("luasnip.extras.expand_conditions").line_begin

local tex = require("util.latex")

local get_visual = function(args, parent)
  if #parent.snippet.env.SELECT_RAW > 0 then
    return sn(nil, t(parent.snippet.env.SELECT_RAW))
  else -- If SELECT_RAW is empty, return a blank insert node
    return sn(nil, i(1))
  end
end

return {
  -- -- s(
  -- --   { trig = "qb", snippetType = "autosnippet", priority = 2000 },
  -- --   fmta("\\qty(<>)", {
  -- --     d(1, get_visual),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "qb", snippetType = "autosnippet" },
  -- --   fmta("\\qty(<>)", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "qB", snippetType = "autosnippet", priority = 2000 },
  -- --   fmta("\\qty{<>}", {
  -- --     d(1, get_visual),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "qB", snippetType = "autosnippet" },
  -- --   fmta("\\qty{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "qp", snippetType = "autosnippet", priority = 2000 },
  -- --   fmta("\\qty[<>]", {
  -- --     d(1, get_visual),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "qp", snippetType = "autosnippet" },
  -- --   fmta("\\qty[<>]", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "mb", snippetType = "autosnippet" },
  -- --   fmta("\\mqty(<>)", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "mB", snippetType = "autosnippet" },
  -- --   fmta("\\mqty{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "mp", snippetType = "autosnippet" },
  -- --   fmta("\\mqty[<>]", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "im", snippetType = "autosnippet" },
  -- --   fmta("\\imat{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "xm", snippetType = "autosnippet" },
  -- --   fmta("\\xmat{<>}{<>}{<>}", {
  -- --     i(1),
  -- --     i(2),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "zm", snippetType = "autosnippet" },
  -- --   fmta("\\zmat{<>}{<>}", {
  -- --     i(1),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "pmat", snippetType = "autosnippet" },
  -- --   fmta("\\pmat{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "dm", snippetType = "autosnippet" },
  -- --   fmta("\\dmat{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "adm", snippetType = "autosnippet" },
  -- --   fmta("\\admat{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "comm", snippetType = "autosnippet" },
  -- --   fmta("\\comm{<>}{<>}", {
  -- --     i(1),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "acom", snippetType = "autosnippet" },
  -- --   fmta("\\acomm{<>}{<>}", {
  -- --     i(1),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "ket", snippetType = "autosnippet", priority = 2000 },
  -- --   fmta("\\ket{<>}", {
  -- --     d(1, get_visual),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "ket", snippetType = "autosnippet" },
  -- --   fmta("\\ket{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "bra", snippetType = "autosnippet", priority = 2000 },
  -- --   fmta("\\bra{<>}", {
  -- --     d(1, get_visual),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "bra", snippetType = "autosnippet" },
  -- --   fmta("\\bra{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "norm", snippetType = "autosnippet", priority = 2000 },
  -- --   fmta("\\norm{<>}", {
  -- --     d(1, get_visual),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "norm", snippetType = "autosnippet" },
  -- --   fmta("\\norm{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "abs", snippetType = "autosnippet", priority = 2000 },
  -- --   fmta("\\abs{<>}", {
  -- --     d(1, get_visual),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "abs", snippetType = "autosnippet" },
  -- --   fmta("\\abs*{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "vu", snippetType = "autosnippet" },
  -- --   fmta("\\vu{<>}", {
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "bk", snippetType = "autosnippet" },
  -- --   fmta("\\ip{<>}{<>}", {
  -- --     i(1),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "kb", snippetType = "autosnippet" },
  -- --   fmta("\\op{<>}{<>}", {
  -- --     i(1),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- s(
  --   { trig = "ev", snippetType = "autosnippet" },
  --   fmta("\\ev{<>}", {
  --     i(0),
  --   }),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "mev", snippetType = "autosnippet" },
  --   fmta("\\ev{<>}{<>}", {
  --     i(1),
  --     i(0),
  --   }),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "mel", snippetType = "autosnippet" },
  --   fmta("\\mel{<>}{<>}{<>}", {
  --     i(1),
  --     i(2),
  --     i(0),
  --   }),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "mdet", snippetType = "autosnippet" },
  --   fmta("\\mdet{<>}", {
  --     i(0),
  --   }),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "ord", wordTrig = false, snippetType = "autosnippet" },
  --   fmta("\\order{<>}", {
  --     i(0),
  --   }),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "qif", wordTrig = false, snippetType = "autosnippet" },
  --   fmta("\\qif", {}),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "qq", wordTrig = false, snippetType = "autosnippet" },
  --   fmta("\\qq{<>}", {
  --     i(0),
  --   }),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "qor", wordTrig = false, snippetType = "autosnippet" },
  --   fmta("\\qor", {}),
  --   { condition = tex.in_mathzone }
  -- ),
  -- s(
  --   { trig = "qif", wordTrig = false, snippetType = "autosnippet" },
  --   fmta("\\qif", {}),
  --   { condition = tex.in_mathzone }
  -- ),
  -- -- s(
  -- --   { trig = "dv", wordTrig = false, snippetType = "autosnippet" },
  -- --   fmta("\\dv[<>]{<>}{<>}", {
  -- --     i(1),
  -- --     i(2),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- -- s(
  -- --   { trig = "pv", wordTrig = false, snippetType = "autosnippet" },
  -- --   fmta("\\pdv{<>}{<>}", {
  -- --     i(1),
  -- --     i(0),
  -- --   }),
  -- --   { condition = tex.in_mathzone }
  -- -- ),
  -- s({ trig = "tr", wordTrig = false, snippetType = "autosnippet" }, fmta("\\tr", {}), { condition = tex.in_mathzone }),
}
